import validator from 'async-validator'

export class ValidatorService {

  // 验证正则列表
  public static regex = {
    // 手机号
    phoneNumber: /^1([^1,2])\d{9}$/,
    // 身份证
    idCard: /(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$)|(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)/,
    // 统一社会信用码（2021-06-08新增）
    uscc: /[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}/,
    // 金额
    money: /(^[1-9](\d+)?(\.\d{1,2})?$)|(^(0){1}$)|(^\d\.\d{1,2}?$)/,
    // 电话号
    callNumber: /(^\d{8}|\d{4}-\{7,8}$)/,
    // 0和正整数(自然数)
    naturalNumber: /^([1-9][0-9]*|0)$/,
    //百分比，保留两位小数
    percentTwoDecimal: /^((\d|[1-9]\d{1})(\.\d{0,1}[0-9])?|100|100\.0|100\.00)$/,
    //纯数字
    isNumber: /^[0-9]*$/,
    // 中文逗号
    isChineseComma: /\uff0c/,
    // 数字和字母
    numAndEn: /^\w+$/,
    // 数字，字母
    numberStr: /^[a-z0-9]+$/i
  }
  /**
   * 自定义验证器
   * @param data 
   * @param descriptor 
   * @param callback 
   */
  public static validate(data: any, descriptor: any) {
    const schema = new validator(descriptor);
    const process = new Promise((reslove, reject) => {
      schema.validate(data, (errors, fields) => {
        // 验证失败
        if (errors) {
          return reject({
            errors,
            fields
          });
        }
        // 验证成功
        reslove()
      });
    })
    return process
  }

  /**
   * 验证手机号
   */
  public static isNumber(rule, value, callback) {
    if (ValidatorService.regex.isNumber.test(value) || !value) {
      callback();
    } else {
      callback(new Error("请输入正确的ID"));
    }
  }

  /**
   * 验证手机号
   */
  public static phoneNumber(rule, value, callback) {
    if (ValidatorService.regex.phoneNumber.test(value) || !value) {
      callback();
    } else {
      callback(new Error("请输入正确的手机号"));
    }
  }
  /**
   * 验证电话号
   */
  public static callNumber(rule, value, callback) {
    if (ValidatorService.regex.callNumber.test(value) || !value) {
      callback();
    } else {
      callback(new Error("请输入正确的电话号"));
    }
  }

  /**
   * 验证身份证
   */
  public static idCard(rule, value, callback) {
    if (ValidatorService.regex.idCard.test(value) || !value) {
      callback();
    } else {
      callback(new Error("请输入正确的身份证号码"));
    }
  }

  /**
   * 验证身份证
   */
  public static numAndEn(rule, value, callback) {
    if (ValidatorService.regex.numAndEn.test(value) || !value) {
      callback();
    } else {
      callback(new Error("请输入非中文"));
    }
  }

  /**
   * 验证证件号（身份证+统一社会信用码）
   */
   public static idcardUscc(rule, value, callback) {
    if (ValidatorService.regex.idCard.test(value) || ValidatorService.regex.uscc.test(value) || !value) {
      callback();
    } else {
      callback(new Error("请输入正确的证件号"));
    }
  }

  /**
   * 验证金额
   */
  public static money(rule, value, callback) {
    if (ValidatorService.regex.money.test(value) || !value) {
      callback();
    } else {
      callback(new Error("请输入正确格式的金额"));
    }
  }

  /**
   * 验证自然数(>=0的整数),不能用于element的form校验
   */
  public static naturalNumber(value) {
    if (ValidatorService.regex.naturalNumber.test(value)) {
      return true
    } else {
      return false
    }
  }

  /**
   * 最多两位小数的百分比,不能用于element的form校验
   */
  public static percentTwoDecimal(value) {
    if (ValidatorService.regex.percentTwoDecimal.test(value)) {
      return true
    } else {
      return false
    }
  }
  /**
   * 数字，字母（不分大小写）
   */
  public static numberStr(rule, value, callback) {
    if (ValidatorService.regex.numberStr.test(value) || !value) {
      callback();
    } else {
      callback(new Error("输入非法字符"));
    }
  }
}
